package dao;

import database.DataBase;
import interfaces.KurvItemInterface;
import interfaces.OrdreInterface;
import interfaces.VareInterface;
import java.rmi.RemoteException;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import model.KurvItem;
import model.Ordre;
import model.Vare;

public class Ordre_DAO {

    private DataBase conn;
    private static Ordre_DAO o_dao;

    public Ordre_DAO() {
        this.conn = DataBase.getInstance();
        //test 
    }

    public static Ordre_DAO getInstance() {
        if (o_dao == null) {
            o_dao = new Ordre_DAO();
        }
        return o_dao;
    }

    public ArrayList<OrdreInterface> hentIkkeBetaltOrdre(String firmanavn) throws SQLException, RemoteException {
        System.out.println("inde i ikke batalte Ordre");
        ArrayList<OrdreInterface> ordrer = new ArrayList<>();

        ResultSet rs = null;

        /* Hent alle vare grupper */
        String sql = "call `ikke betalte ordre`('" + firmanavn + "');";
        System.out.println("sql " + sql);
        rs = conn.getResult(sql);
        while (rs.next()) /* Hent samtlige varegrupper .. */ {
            System.out.println("henter ikke betalte");
            Ordre o = new Ordre(rs.getInt("ordreid"), rs.getString("fnavn"));
            ordrer.add(o);
            // der skal tilføjes linier???
        }

        return ordrer;
    }



    public ArrayList<OrdreInterface> hentIkkeModtagedeOrdre(String firmanavn) throws SQLException, RemoteException {
        System.out.println("inde i ikke batalte Ordre");
        ArrayList<OrdreInterface> ordrer = new ArrayList<>();

        ResultSet rs = null;

        /* Hent alle vare grupper */
        String sql = "call `ikke modtaget ordre`('" + firmanavn + "');";
        System.out.println("sql " + sql);
        rs = conn.getResult(sql);
        while (rs.next()) /* Hent samtlige varegrupper .. */ {
            System.out.println("henter ikke betalte");
            Ordre o = new Ordre(rs.getInt("ordreid"), rs.getString("fnavn"));
            ordrer.add(o);
            // der skal tilføjes linier???
        }

        return ordrer;
    }

    public ArrayList<OrdreInterface> hentAlleOrdre(String firmanavn) throws SQLException, RemoteException {
        ArrayList<OrdreInterface> ordrer = new ArrayList<>();
        ResultSet rs = null;

        /* Hent alle vare grupper */
        String sql = "call `hent ordre`('" + firmanavn + "');";

        rs = conn.getResult(sql);
        while (rs.next()) {
            Ordre o = new Ordre(rs.getInt("ordreid"), rs.getString("fnavn"));
            o.setBetalt(rs.getBoolean("betalt"));
            o.setModtaget(rs.getBoolean("modtaget"));
            o.setSum(rs.getInt("sum"));
            ordrer.add(o);
            System.out.println("tilføjer " + o.getOrdreID() + "  " + o.getSum());
            // der skal tilføjes linier???
        }
        return ordrer;
    }

    public void modtagetOrdre(String firmanavn, int ordreid) throws RemoteException {
        String sql = "call `ordre modtaget`( " + ordreid + ", '" + firmanavn + "');";
        System.out.println("modaget ordre " + sql);
        try {
            conn.execute(sql);
        } catch (SQLException ex) {
            ex.getStackTrace();
        }

    }

    public int opretOrdre(String firma) throws RemoteException {
        int oId = 0;
        String sql = "call `opret ordre`('" + firma + "');";
        try {
            ResultSet rs = conn.getResult(sql);
            while (rs.next()) /* Hent ordreid.. */ {
                oId = rs.getInt(1);
            }
        } catch (SQLException ex) {
            System.out.println(ex.getMessage());
        }
        return oId;
    }

    public void tilfoejVarer(int ordreId, String varenavn, String varegruppeNavn, double pris, int antal) {
        String sql = "call `tilføj vare`( '" + ordreId + "', '" + varenavn + "', '" + varegruppeNavn + "', '" + pris + "', '" + antal + "');";
        try {
            conn.execute(sql);
        } catch (SQLException ex) {
            System.out.println(ex.getMessage());
        }
    }

    public void betalOrdre(String firmanavn, int ordreid) throws RemoteException {
        String sql = "call `betal ordre`( " + ordreid + ", '" + firmanavn + "');";
        System.out.println("betal ordre " + sql);
        try {
            conn.execute(sql);
        } catch (SQLException ex) {
            ex.getStackTrace();
        }

    }

    public OrdreInterface hentOrdren(String firmanavn, int ordreid) {
        String sql = "call `hent ordren`('" + firmanavn + "', " +  ordreid + ");";
         OrdreInterface ordre = null;
        try {
            ResultSet rs = conn.getResult(sql);
           
            while (rs.next()) /* Hent ordreid.. */ {
                ordre = new Ordre(rs.getInt("ordreid"), rs.getString("fnavn"));
                ordre.setBetalt(rs.getBoolean("betalt"));
                ordre.setModtaget(rs.getBoolean("modtaget"));
                ordre.setSum(rs.getInt("sum"));
            }
        } catch (SQLException ex) {
            System.out.println(ex.getMessage());
        } catch (RemoteException ex) {
            System.out.println(ex.getMessage());
        }
        
         sql = "call `hent kurvItems`(" +  ordreid + ");";
        
        try {
            ResultSet rs = conn.getResult(sql);
           
            while (rs.next()) /* Hent ordreid.. */ {
                VareInterface vare = new Vare(rs.getString("navn"), rs.getDouble("pris"), rs.getInt("antal"), rs.getString("vgruppe"));
                KurvItemInterface ki = new KurvItem(rs.getInt("oid"), vare, rs.getInt("antal") );
                ordre.addItem(ki);
            }
        } catch (SQLException ex) {
            System.out.println(ex.getMessage());
        } catch (RemoteException ex) {
            System.out.println(ex.getMessage());
        }
        
        return ordre;
        
    }

}
